#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<errno.h>

char *const addenv[] = {
        "MYVAL=123456789",
        NULL
};

int main()
{
        printf("我的程序运行了!\n");
        if(fork() == 0)
        {
                printf("I Am Child, My Pid Is: %d\n", getpid());
                sleep(1);
                char *const argv[] = {
                        "other",
                        "-a",
                        "-b",
                        "-c",
                        "-d",
                        NULL
                };
                for(int i = 0; addenv[i]; i++)
                {
                        putenv(addenv[i]);
                }
                extern char **environ; //声明
                execvpe("./other", argv, environ);
                exit(1);
        }
        waitpid(-1, NULL, 0);
        printf("我的程序运行完毕了\n");
        return 0;
}

//char *newenv = "MYVAL=123456789"; //putenv必须这样新增env
//int main()
//{
//        printf("我的程序运行了!\n");
//        if(fork() == 0)
//        {
//                printf("I Am Child, My Pid Is: %d\n", getpid());
//                sleep(1);
//                char *const argv[] = {
//                        "other",
//                        "-a",
//                        "-b",
//                        "-c",
//                        "-d",
//                        NULL
//                };
//                char *const env[] = {
//                        "MYVAL=123456789",
//                        NULL
//                };
//                putenv(newenv);
//                execvp("./other", argv);
//                exit(1);
//        }
//        waitpid(-1, NULL, 0);
//        printf("我的程序运行完毕了\n");
//        return 0;
//}

//int main()
//{
//        printf("我的程序运行了!\n");
//        if(fork() == 0)
//        {
//                printf("I Am Child, My Pid Is: %d\n", getpid());
//                sleep(1);
//                char *const argv[] = {
//                        "other",
//                        "-a",
//                        "-b",
//                        "-c",
//                        "-d",
//                        NULL
//                };
//                char *const env[] = {
//                        "MYVAL=123456789",
//                        NULL
//                };
//                execvp("./other", argv);
//                exit(1);
//        }
//        waitpid(-1, NULL, 0);
//        printf("我的程序运行完毕了\n");
//        return 0;
//}

//int main()
//{
//        printf("我的程序运行了!\n");
//        if(fork() == 0)
//        {
//                printf("I Am Child, My Pid Is: %d\n", getpid());
//                sleep(1);
//                char *const argv[] = {
//                        "other",
//                        "-a",
//                        "-b",
//                        "-c",
//                        "-d",
//                        NULL
//                };
//                char *const env[] = {
//                        "MYVAL=123456789",
//                        NULL
//                };
//                execvpe("./other", argv, env);
//                exit(1);
//        }
//        waitpid(-1, NULL, 0);
//        printf("我的程序运行完毕了\n");
//        return 0;
//}

//int main()
//{
//        printf("我的程序运行了!\n");
//        if(fork() == 0)
//        {
//                printf("I Am Child, My Pid Is: %d\n", getpid());
//                sleep(1);
//                char *const argv[] = {
//                        "ls",
//                        "-l",
//                        "-a",
//                        NULL
//                };
//                execvp(argv[0], argv);
//                exit(1);
//        }
//        waitpid(-1, NULL, 0);
//        printf("我的程序运行完毕了\n");
//        return 0;
//}

//int main()
//{
//        printf("我的程序运行了!\n");
//        if(fork() == 0)
//        {
//                printf("I Am Child, My Pid Is: %d\n", getpid());
//                sleep(1);
//                char *const argv[] = {
//                        "ls",
//                        "-l",
//                        "-a",
//                        NULL
//                };
//                execv("/usr/bin/ls", argv);
//                exit(1);
//        }
//        waitpid(-1, NULL, 0);
//        printf("我的程序运行完毕了\n");
//        return 0;
//}

//int main()
//{
//        printf("我的程序运行了!\n");
//        if(fork() == 0)
//        {
//                printf("I Am Child, My Pid Is: %d\n", getpid());
//                sleep(1);
//                execlp("ls", "ls", "-l", "-a", NULL);
//                exit(1);
//        }
//        waitpid(-1, NULL, 0);
//        printf("我的程序运行完毕了\n");
//        return 0;
//}

//int main()
//{
//        printf("我的程序运行了!\n");
//        execl("/usr/bin/ls", "ls", "-l", "-a", NULL);
//        printf("我的程序运行完毕了\n");
//        return 0;
//}

//int main()
//{
//        pid_t id = fork();
//        if(id == 0)
//        {
//                int cnt = 3;
//                while(1)
//                {
//                        sleep(3);
//                        printf("我是一个子进程，pid: %d, ppid: %d\n", getpid(), getppid());
//                        sleep(1);
//                        cnt--;
//                }
//                exit(10);
//        }
//        while(1)
//        {
//                int status = 0;
//                pid_t rid = waitpid(id, &status, WNOHANG);
//                if(rid > 0)
//                {
//                        printf("wait success, rid: %d, exit code: %d, exit signal: %d\n", rid, (status >> 8) & 0xff, status & 0xff);
//                        break;
//                }
//                else if(rid == 0)
//                {
//                        printf("本轮调用结束， 子进程没有退出\n");
//                        sleep(1);
//                }
//                else
//                {
//                        printf("等待失败\n");
//                        break;
//                }
//        }
//}

//int main()
//{
//        pid_t id = fork();
//
//        if(id == 0)
//        {
//                int cnt = 3;
//                while(cnt)
//                {
//                        printf("我是一个子进程，pid: %d, ppid: %d\n", getpid(), getppid());
//                        sleep(1);
//                        cnt--;
//                }
//                exit(1);
//        }
//        int status = 0;
//        pid_t rid = waitpid(id, &status, 0);
//        if(rid > 0)
//        {
//                //printf("wait success, rid: %d, status: %d\n", rid, status);
//                printf("wait success, rid: %d, status: %d\n", rid, (status >> 8) & 0xff);
//        }
//        else 
//        {
//                printf("wait failed: %d: %s\n", errno, strerror(errno));
//        }
//        return 0;
//}

//int main()
//{
//        pid_t id = fork();
//        if(id == 0)
//        {
//                int cnt = 5;
//                while(cnt)
//                {
//                        printf("我是一个子进程，pid: %d, ppid: %d\n", getpid(), getppid());
//                        sleep(1);
//                        cnt--;
//                }
//                exit(0);
//        }
//        sleep(10);
//        pid_t rid = wait(NULL);
//        if(rid > 0)
//        {
//                printf("wait success, rid: %d\n", rid);
//        }
//        sleep(10);
//        return 0;
//}

//int main()
//{
//        pid_t id = fork();
//
//        if(id == 0)
//        {
//                int cnt = 5;
//                while(cnt)
//                {
//                        printf("我是一个子进程，pid: %d, ppid: %d\n", getpid(), getppid());
//                        sleep(1);
//                        cnt--;
//                }
//                exit(0); //子进程退出
//        }
//        // 父进程
//        sleep(100);
//        return 0;
//}

//int main()
//{
//    printf("main!");
//    sleep(2);
//    _exit(23);
//}


//void fun()
//{
//    printf("fun begin!\n");
//    _exit(4);
//    printf("fun end!\n");
//}
//
//int main()
//{
//    fun();
//    printf("main!\n");
//    return 0;
//} 

//void fun()
//{
//	printf("fun begin!\n");
//	exit(40);
//	printf("fun end!\n");
//}
//
//int main()
//{
//	fun();
//	printf("main!\n");
//	return 0;
//}

//int main()
//{
//	int a = 10;
//	a /= 0;
//	return 89;
//}

//int main()
//{
//	int i = 0;
//	for(; i < 200; i++)
//	{
//		printf("%d-> %s\n",i, strerror(i));
//	}
//	return 0;
//}

//int main()
//{
//	printf("hello world!\n");
//	return 0;
//}
